#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
//全局变量命名
int position_x,position_y;//飞机位置
int bullet_x,bullet_y;    //子弹位置
int enemy_x,enemy_y;      //敌机位置
int high,width;           //游戏画面尺度
int score;
int pause=0;            //暂停键

void gotoxy(int x,int y)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(handle,pos);
}

void HideCursor()
{
    CONSOLE_CURSOR_INFO cursor_info={1,0};//第二个值为0表示隐藏光标
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

void start()              //数据初始化
{
    high=18;
    width=30;

    position_x=high/2;
    position_y=width/2;

    bullet_x=-1;
    bullet_y=0;

    enemy_x=0;
    enemy_y=width/2;

    score=0;

    HideCursor();
}

void show()         //显示画面
{
    int i,j;

    gotoxy(0,0);//光标移动到原点位置，以下重画清屏

    for(i=0;i<high;i++)
    {
        for(j=0;j<width;j++)
        {
            if((i==position_x)&&(j==position_y))//输出飞机
                printf("*");
            if((i==position_x+1)&&(j==position_y-2))
                printf("*****");
            if((i==position_x+2)&&(j==position_y-1))
                printf("* *");

            else if((i==bullet_x)&&(j==bullet_y))//输出子弹
                printf("|");
            else if((i==enemy_x)&&(j==enemy_y)) //输出敌机
                printf("@");
            else
                printf(" ");//输出空格
        }
        printf("\n");
    }
    printf("得分:%d\n",score);
}


void update_without_input() //与用户输入无关的
{
    if((bullet_x==enemy_x)&&(bullet_y==enemy_y))
    {
        score++;
        bullet_x=-1;
        enemy_x=0;
        enemy_y=rand()%width;
    }
    static int speed=0;//用于控制子弹下落速度
    if(speed<20)
    {
        speed++;
    }
    if(bullet_x>-1)
        bullet_x--;

    if(enemy_x>high)
    {
        enemy_x=0;
        enemy_y=rand()%width;
    }
    else
    {
        if(speed==20)
        {
            if(score>5)
                enemy_x++;
            enemy_x++;
            speed=0;
        }
    }
}

void update_with_input()
{
    char input;

    if(kbhit())//当用户按键时执行
    {
        input=getch();
        if(input==27)       //执行暂停和继续功能
        {
            if(pause==0)
                pause=1;
            else
                pause=0;
        }
        if(input=='s'&&position_x<high-1)
            position_x++;
        if(input=='w'&&position_x>1)
            position_x--;
        if(input=='d'&&position_y<width-1)
            position_y++;
        if(input=='a'&&position_y>1)
            position_y--;
        if(input==' ')
        {
            bullet_x=position_x-1;
            bullet_y=position_y;
        }
    }
}

int main()
{
    start();
    while(1)
    {
        if(pause==0)//执行继续功能
        {
            show();
            update_without_input();
        }
         update_with_input();
    }
    return 0;
}